package com.rocket.demo1;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;

public class Producer {
    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
        /*
        group 相同的生产者成为一个生产者组

        标识发送同一类消息的Producer，通常发送逻辑一致。
        发送普通消息的时候，仅标识使用，并无特别用处。

        若发送事务消息，发送某条消息的producer-A宕机，
        使得事务消息一直处于PREPARED状态并超时，
        则broker会回查同一个group的其他producer，
        确认这条消息应该commit还是rollback。

        但开源版本并不完全支持事务消息（阉割了事务回查的代码）。?????
         */
        DefaultMQProducer mqProducer = new DefaultMQProducer("rocket-producer");
        /*
        连接nameserver集群, 获得注册的broker信息
         */
        //mqProducer.setNamesrvAddr("192.168.64.151:9876:192.168.64.152:9876");//多个服务器的形式
        mqProducer.setNamesrvAddr("127.0.0.1:9876");
        mqProducer.start();
         /*
        主题相当于是消息的分类, 一类消息使用一个主题
         */
         String topic = "topic-demo1";//相当于一级分类
         /*
        tag 相当于是消息的二级分类, 在一个主题下, 可以通过 tag 再对消息进行分类
         */
        String tag = "tag-a";
        for (int i = 0; i < 1; i++) {
            System.out.println("请输入消息,多条消息用,隔开");
//            String[] msg = new Scanner(System.in).nextLine().split(",");
            String[] msg = new String[] {"ddd","eeefff","wwww","rttyyyy","wewweewyuuu","qqqqfff"};
            for (String msg_str: msg) {
                //一级分类, 二级分类, 消息内容
                Message message = new Message(topic, tag, msg_str.getBytes());
                // 发送消息后会得到服务器反馈, 包含: smsgId, sendStatus, queue, queueOffset, offsetMsgId
                SendResult sendResult = mqProducer.send(message);
                System.out.println(sendResult);
            }

        }

    }
}
